//
//  main.m
//  01-Block
//
//  Created by Jason on 15/9/20.
//  Copyright © 2015年 Jason. All rights reserved.
// block


/*
    1.定义block变量
    返回值类型(^block变量名) (参数类型1, 参数类型2, ...);
 
    2.给block变量赋值
    block变量名 = ^(参数类型1, 参数名称1, ...){
 
    };
 
// 需要掌握:
 1.定义block变量
 2.给block变量赋值
 3.type和block的应用
 */

typedef int (^MyBlock)(int, int);

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    /*
    int (^minusBlock) (int, int) = ^(int a, int b) {
        
        return a - b;
    };
    
    minusBlock(5, 2);
    
    int (^averageBlock) (int, int) = ^(int a, int b) {
        
        return (a + b) / 2;
    };
     
     */
    
    MyBlock minus = ^(int a, int b) {
      
        return a - b;
    };
    
    int min = minus(5, 4);
    NSLog(@"min=%d", min);
    
    MyBlock sum = ^(int v1, int v2) {
      
        return v1 + v2;
    };
    
    int sumResult = sum(10, 20);
    NSLog(@"sumResult=%d", sumResult);
    
    
    
    return 0;
}

void test2() {
    
    
    int a = 10;
    
    __block int b = 11;
    
    void(^block) () = ^ {
        
        //        a = 12; block内部不能修改默认的局部变量
        b = 12;
        NSLog(@"b=%d", b);
        
    };
    
    block();
    
}

// block基本定义
void test1(){
    /*
     1.左边的void:block没有返回值
     2.最右边的():没有参数
     3.中间的(^) block的标志,不能少
     */
    void (^myBlock)() = ^{
        
        int a = 10;
        int b = 11;
        NSLog(@"a=%d, b=%d", a, b);
        
    };
    
    myBlock();
    
    
    /*
     定义一个block变量,变量名是sumBlock
     最左边的int: block的返回值是int类型
     最右边的(int, int) block接受两个int类型的参数
     */
    
    int(^sumBlock)(int, int);
    sumBlock = ^(int v1, int v2) {
        
        return v1 + v2;
    };
    
    int sum = sumBlock(10,20);
    NSLog(@"sum=%d", sum);
    

    
}
